var changeLog = '\
Версия 0.1.7:\n\
+ Доработан Умный поиск (пока что работает не очень стабильно и не очень правдиво - сейчас работает через сервис last.fm, но уже смотрю в сторону discogs.com, скорее всего таки переберёмся на него)\n\
\n\
Версия 0.1.6.2:\n\
- Устранены несколько некритических ошибок\n\
+ Несколько обновлено окно Умного поиска (пока работает не полностью, но некий функционал уже есть)\n\
\n\
Версия 0.1.6.1:\n\
- Устранены несколько некритических ошибок\n\
+ Добавлена возможность другим дополнениям взаимодействовать с VkControls для Chrome:\n\
	+ Создано дополнение VkControlsPausePlay (добавляет кнопку плэй/пауза на панель) - https://chrome.google.com/webstore/detail/deddlfkkimgojlpjjbcdpmcnobmnoomn\n\
	+ Создано дополнение VkControlsPrevTrack (добавляет воспроизведения предыдущего трека на панель) - https://chrome.google.com/webstore/detail/ogfchhdbdigmkhmlfjjdgdfbcakdnond\n\
	+ Создано дополнение VkControlsNextTrack (добавляет воспроизведения следующего трека на панель) - https://chrome.google.com/webstore/detail/ocfapaljljiopgjgaldgkdhjakndiipf\n\
\n\
Версия 0.1.6:\n\
∓ Изменён домен API с vkontakte.ru на vk.com (разницы в принципе никакой, но были нарекания - исправил)\n\
+ Добавлены горячие клавиши для управления плеером (пока что не очень стабильно, возможно перед использованием нужно включить/выключить дополнение, если нужны дополнительные действия - пишите)\n\
+ Началась работа над внедрением функции "Умный поиск" для работы с исполнителями, альбомами и жанрами (API last.fm)\n\
\n\
Версия 0.1.5:\n\
+ Добавлена возможность воспроизведения альбомов\n\
+ Добавлена возможность управлять альбомами:\n\
	+ Переместить трек в альбом\n\
	+ Переместить трек в основной альбом\n\
∓ Исправлен вид кнопки для скачивания треков\n\
+ В настройках добавлено окно "О программе"\n\
+ Добавлена история версий\n\
+ Добавлена возможность пожертвовать денег разработчику\n\
\n\
Версия 0.1.4:\n\
+ Добавлено отображение текущей позиции (времени) воспроизведения на кнопке на панели\n\
∓ Переделан механизм скачивания аудиозаписей, теперь при скачивании файл называется так, как называется трек + скачивание происходит без промежуточных окон\n\
\n\
Версия 0.1.3:\n\
+ Добавлена возможность удалять треки из своих аудиозаписей\n\
+ Добавлена возможность добавлять треки в свои аудиозаписи\n\
+ Добавлен пункт контекстного меню для воспроизведения выбранного трека\n\
+ Добавлено окно настроек дополнения\n\
\n\
Версия 0.1.2:\n\
+ Добавлено всплывающее окно с названием трека и основными элементами управления плеером\n\
\n\
Версия 0.0.1-0.1.1:\n\
+ Реализован механизм загрузки списков\n\
+ Реализован механизм воспроизведения треков\n\
+ Реализован механизм поиска треков\n\
+ Реализован механизм управления воспроизведением трека:\n\
	+ Плей/пауза\n\
	+ Предыдущий/следующий трек\n\
	+ Повтор трека\n\
	+ Изменение громкости воспроизведения трека\n\
	+ Промотка трека к выбранному месту'
var options;
var about;
var needSave = false;
var hotkeysStore;

Ext.onReady(function() {
	var keys = 'A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|0|1|2|3|4|5|6|7|8|9|Tab|Space|Return|Enter|Backspace|Scroll_lock|Caps_lock|Num_lock|Pause|Insert|Home|Delete|End|Page_up|Page_down|Left|Up|Right|Down|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12'.split('|');

	HotkeyWindow = Ext.extend(Ext.window.Window, {
		id: 'hotkeyWindow',
		bodyStyle: 'padding: 5px;',
		width: 210,
		resizable: false,
		modal: true,
	    layout: {
	        type: 'table',
	        columns: 4
	    },
		buttons: [
			{
				text: 'Ок',
				handler: function() {
					needSave = true;
					Ext.getCmp('hotkeyWindow').close();
				}
			},
			{
				text: 'Отмена',
				handler: function() {
					needSave = false;
					Ext.getCmp('hotkeyWindow').close();
				}
			}
		],
		items: [
			{
				id: 'ctrl',
				xtype: 'button',
				text: 'ctrl',
				enableToggle: true
			},
			{
				id: 'alt',
				xtype: 'button',
				text: 'alt',
				enableToggle: true
			},
			{
				id: 'shift',
				xtype: 'button',
				text: 'shift',
				enableToggle: true
			},
			{
				id: 'key',
				xtype: 'combo',
				forceSelection: true,
				width: 95,
				store: keys
			},
			{
				id: 'inFields',
				xtype: 'checkbox',
				boxLabel: 'В текстовых полях',
				colspan: 4
			}
		],
		getHotkey: function() {
			return Ext.getCmp('key') && Ext.getCmp('key').value?
				((Ext.getCmp('ctrl').pressed?'Ctrl+':'') + (Ext.getCmp('alt').pressed?'Alt+':'') + (Ext.getCmp('shift').pressed?'Shift+':'') + Ext.getCmp('key').value):
				null;
		},
		listeners: {
			show: function() {
				var hotkey = this.hotkey;
				if (!hotkey) return;
				var components = hotkey.split('+');
				Ext.getCmp('ctrl').toggle(components.indexOf('Ctrl') >= 0);
				Ext.getCmp('alt').toggle(components.indexOf('Alt') >= 0);
				Ext.getCmp('shift').toggle(components.indexOf('Shift') >= 0);
				Ext.getCmp('inFields').setValue(this.inFields);
				Ext.getCmp('key').select(components[components.length - 1]);
			},
			beforeclose: function() {
				if (needSave) {
					hotkeysStore.getAt(hotkeysStore.find('action', this.action)).set('hotkey', this.getHotkey());
					hotkeysStore.getAt(hotkeysStore.find('action', this.action)).set('inFields', Ext.getCmp('inFields').checked);
					hotkeysStore.sync();
					chrome.extension.getBackgroundPage().applyHotkeys(null, this.hotkey);
				}
			}
		}
	});

	Ext.define('Hotkey', {
		extend: 'Ext.data.Model',
		fields: ['id', 'action', 'title', 'hotkey', {name: 'inFields', type: 'boolean', defaultValue: false}, 'func'],
	    proxy: {
	    	id: 'hotkeys',
	        type: 'localstorage',
	    }
	});

	hotkeysStore = new Ext.data.Store({
		model: 'Hotkey'
	});

	hotkeysStore.load();
	if (hotkeysStore.find('action', 'play') < 0) hotkeysStore.add({action: 'play', title: 'Плэй', hotkey: null, func: 'chrome.extension.getBackgroundPage().bg.play()'});
	if (hotkeysStore.find('action', 'pause') < 0) hotkeysStore.add({action: 'pause', title: 'Пауза', hotkey: null, func: 'chrome.extension.getBackgroundPage().bg.pause()'});
	if (hotkeysStore.find('action', 'playpause') < 0) hotkeysStore.add({action: 'playpause', title: 'Плэй/пауза', hotkey: 'Shift+Space', func: 'chrome.extension.getBackgroundPage().bg.playpause()'});
	if (hotkeysStore.find('action', 'prevtrack') < 0) hotkeysStore.add({action: 'prevtrack', title: 'Предыдущий трек', hotkey: 'Shift+Left', func: 'chrome.extension.getBackgroundPage().bg.prev()'});
	if (hotkeysStore.find('action', 'nexttrack') < 0) hotkeysStore.add({action: 'nexttrack', title: 'Следующий трек', hotkey: 'Shift+Right', func: 'chrome.extension.getBackgroundPage().bg.next()'});
	if (hotkeysStore.find('action', 'repeat') < 0) hotkeysStore.add({action: 'repeat', title: 'Включить/выключить повтор', hotkey: null, func: 'chrome.extension.getBackgroundPage().bg.togglerepeat()'});
	if (hotkeysStore.find('action', 'forward') < 0) hotkeysStore.add({action: 'forward', title: 'Промотать вперёд на 10%', hotkey: 'Ctrl+Shift+Right', func: 'chrome.extension.getBackgroundPage().bg.forward()'});
	if (hotkeysStore.find('action', 'rewind') < 0) hotkeysStore.add({action: 'rewind', title: 'Промотать назад на 10%', hotkey: 'Ctrl+Shift+Left', func: 'chrome.extension.getBackgroundPage().bg.rewind()'});
	if (hotkeysStore.find('action', 'volumeup') < 0) hotkeysStore.add({action: 'volumeup', title: 'Увеличить громкость на 5%', hotkey: 'Shift+Up', func: 'chrome.extension.getBackgroundPage().bg.volumeup()'});
	if (hotkeysStore.find('action', 'volumedown') < 0) hotkeysStore.add({action: 'volumedown', title: 'Уменьшить громкость на 5%', hotkey: 'Shift+Down', func: 'chrome.extension.getBackgroundPage().bg.volumedown()'});
	if (hotkeysStore.find('action', 'mute') < 0) hotkeysStore.add({action: 'mute', title: 'Включить/выключить звук', hotkey: 'Ctrl+Shift+Space', func: 'chrome.extension.getBackgroundPage().bg.togglemute()'});
	hotkeysStore.sync();

	about = Ext.create('Ext.window.Window', {
		title: 'О программе',
		bodyStyle: 'padding: 8px;',
		resizable: false,
		layout: {
			type: 'vbox'
		},
		constrain: true,
		modal: true,
		width: 550,
		height: 400,
		closeAction: 'hide',
		items: [
			{
				xtype: 'displayfield',
				fieldLabel: 'Название',
				value: '<a target="_blank" href="http://vk.com/vkcontrols">' + chrome.app.getDetails().name + '</a>'
			},
			{
				xtype: 'displayfield',
				fieldLabel: 'Версия',
				value: chrome.app.getDetails().version
			},
			{
				xtype: 'displayfield',
				fieldLabel: 'Описание',
				value: 'Дополнение для управления плеером ВК. Переключайте треки, проматывайте, изменяйте громкость, останавливайте музыку в один клик!',
				width: 525
			},
			{
				xtype: 'displayfield',
				fieldLabel: 'Автор',
				value: '<a target="_blank" href="http://vk.com/lufton">Luft-on</a>',
			},
			{
				xtype: 'displayfield',
				fieldLabel: 'Описание',
				value: 'Дополнение для управления плеером ВК. Переключайте треки, проматывайте, изменяйте громкость, останавливайте музыку в один клик!',
				width: 525
			},
			{
				xtype: 'textareafield',
				fieldLabel: 'История версий',
				readOnly: true,
				value: changeLog,
				width: 525,
				height: 155
			}
		],
		buttons: [
			{
				text: 'Поддержать разработчика',
				handler: function() {
					chrome.windows.getCurrent(function(win) {
						chrome.tabs.create({
							windowId: win.id,
							url: 'http://lufton.ks.ua/other/donate.html',
							active: true,
							index: 3
						});
					});
				}
			}
		]
	});

	Ext.create('Ext.window.Window', {
		title: 'Опции',
		bodyStyle: 'padding: 8px;',
		resizable: false,
		layout: 'fit',
		constrain: true,
		tbar: [
			{
				xtype: "label",
				text: (localStorage.token && localStorage.expires > new Date - 0)?localStorage.lastName + " " + localStorage.firstName:"Вы не авторизированы"
			},
			'->',
			{
				text: (localStorage.token && localStorage.expires > new Date - 0)?"Выйти":"Войти",
				handler: function() {
					if (localStorage.token && localStorage.expires > new Date - 0) {
						Ext.Ajax.request({
							url: 'http://oauth.vk.com/oauth/logout',
							params: {
								client_id: 2847164,
								scope: "audio",
								redirect_uri: "http://api.vk.com/blank.html",
								display: "popup",
								response_type: "token"
							},
							method: "get",
							success: function(response) {
								var obj = Ext.decode(response.responseText);
								if (obj) {
									localStorage.removeItem("token");
									localStorage.removeItem("expires");
									localStorage.removeItem("userId");
									localStorage.removeItem("firstName");
									localStorage.removeItem("lastName");
									chrome.tabs.getCurrent(function(tab) {
										chrome.tabs.reload(tab.id);
									});
								}
							},
							failure: function(response) {
								var obj = Ext.decode(response.responseText);
								if (obj) {
									localStorage.removeItem("token");
									localStorage.removeItem("expires");
									localStorage.removeItem("userId");
									localStorage.removeItem("firstName");
									localStorage.removeItem("lastName");
									chrome.tabs.getCurrent(function(tab) {
										chrome.tabs.reload(tab.id);
									});
								}
							}
						});
					} else {
						chrome.extension.getBackgroundPage().login(function() {
							chrome.tabs.getCurrent(function(tab) {
								chrome.tabs.reload(tab.id);
							});
						});
					}
				}
			},
			{
				text: '?',
				handler: function() {
					about.show();
				}
			}
		],
		items: [
			{
				xtype: "checkbox",
				boxLabel: 'Список свернут',
				checked: localStorage.collapsed,
				handler: function(cb, checked) {
					if (checked) localStorage.collapsed = 1;
					else localStorage.removeItem("collapsed");
				}
			},
			{
				xtype: "checkbox",
				boxLabel: 'Показывать всплывающие окна',
				checked: localStorage.notify,
				handler: function(cb, checked) {
					if (checked) localStorage.notify = 1;
					else localStorage.removeItem("notify");
					Ext.getCmp("hidenotifications").setDisabled(!checked);
					Ext.getCmp("duration").setDisabled(!checked || Ext.getCmp("hidenotifications").checked);
				}
			},
			{
				id: "hidenotifications",
				xtype: "checkbox",
				boxLabel: 'Не убирать всплывающие окна',
				checked: localStorage.pinned,
				disabled: !localStorage.notify,
				handler: function(cb, checked) {
					chrome.extension.getViews({type:"notification"}).forEach(function(win) {
						win.Ext.getCmp("pinned").toggle(checked);
					});
					if (checked) localStorage.pinned = 1;
					else localStorage.removeItem("pinned");
					Ext.getCmp("duration").setDisabled(checked);
				}
			},
			{
				id: "duration",
				xtype: "numberfield",
				disabled: localStorage.pinned || !localStorage.notify,
				fieldLabel: 'Длительность',
				value: localStorage.duration || 3000,
				step: 250,
				minValue: 250,
				maxValue: 30000,
				listeners: {
					change: function(t, newValue) {
						localStorage.duration = newValue;
					}
				}
			},
			{
				xtype: 'grid',
				store: hotkeysStore,
				height: 150,
				columns: [
					{ header: 'Действие',  dataIndex: 'title', menuDisabled: true, width: 140 },
					{ header: 'Сочитание клавиш', dataIndex: 'hotkey', menuDisabled: true, width: 110 }
				],
				listeners: {
					itemdblclick: function(grid, record) {
						new HotkeyWindow({
							title: record.get('title'),
							action: record.get('action'), 
							hotkey: record.get('hotkey'),
							inFields: record.get('inFields')
						}).show();
					}
				}
			}
		],
		listeners: {
			destroy: function() {
				chrome.tabs.getCurrent(function(tab) {
					chrome.tabs.remove(tab.id);
				});
			}
		}
	}).show();
	if (window.location.search.substring(1) == "firstrun") about.show();
});